#include "stdio.h"
#include "stdint.h"
#include "microString.h"


void *vMemset(void *str, int c, size_t n)
{
    uint8_t *pucStr = str;

    while((n--) > 0)
    {
        *pucStr++ = c;
    }

    return str;
}

void *vMemcpy(void *str1, const void *str2, size_t n)
{
    uint8_t *pucStr1 = str1, *pucStr2 = (uint8_t *)str2;

    while((n--) > 0)
    {
        *pucStr1++ = *pucStr2++;
    }

    return str1;
}

void *vMemchr(const void *str, int c, size_t n)
{
    uint8_t *pucStr = (uint8_t *)str;

    while((n--) > 0)
    {
        if(*pucStr++ == c)
            return --pucStr;
    }

    return NULL;
}

size_t iStrlen(const char *str)
{
    size_t iLength = 0;

    while(*str++ != 0)
    {
        ++iLength;
    }

    return iLength;
}

char *pcStrcpy(char *dest, const char *src)
{
    while(*src != 0)
    {
        *dest++ = *src++;
    }

    return dest;
}

char *pcStrncpy(char *dest, const char *src, size_t n)
{
    while((*src != 0) && ((n--) > 0))
    {
        *dest++ = *src++;
    }

    return dest;
}

int iStrcmp(char *str1, const char *str2)
{
    while((*str1 != 0) && (*str2 != 0))
    {
        if(*str1 > *str2)
            return 1;
        else if(*str1 < *str2)
            return -1;

        str1++;
        str2++;
    }

    return 0;
}

int iStrncmp(char *str1, const char *str2, size_t n)
{
    while((*str1 != 0) && (*str2 != 0) && ((n--) > 0))
    {
        if(*str1 > *str2)
            return 1;
        else if(*str1 < *str2)
            return -1;

        str1++;
        str2++;
    }

    return 0;
}

int iStrncasecmp(char *str1, const char *str2, size_t n)
{
    char c1, c2;

    while((*str1 != 0) && (*str2 != 0) && ((n--) > 0))
    {
        c1 = (*str1 >= 'A' && *str1 <= 'Z') ? (*str1 + ('a' - 'A')) : *str1;
        c2 = (*str2 >= 'A' && *str2 <= 'Z') ? (*str2 + ('a' - 'A')) : *str2;

        if(c1 > c2)
            return 1;
        else if(c1 < c2)
            return -1;

        str1++;
        str2++;
    }

    return 0;
}
